<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

require_once 'Zend/Db/Table/Abstract.php';
require_once APPLICATION_PATH . '/models/Exception/NoExisteEntidadException.php';

/**
 * Description of BaseMapper
 *
 * @author kristian
 */
abstract class Spalm_Model_Mapper_BaseMapper {
    protected $_dbTable;

    public function  __construct($dbTable) {
        $this->setDbTable($dbTable);
    }

    /**
     * Especifica la clase especifica vinculada con la base de datos
     *
     * @param Zend_Db_Table_Abstract $dbTable
     * @return <type>
     */
    public function setDbTable(Zend_Db_Table_Abstract $dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
//        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
//            throw new TipoIncorrectoException('Tabla provista invalida');
//        }
        $this->_dbTable = $dbTable;
        return $this;
    }

        public function getDbTable()
    {
        /*
        if (null === $this->_dbTable) {
            $this->setDbTable('Spalm_Model_Single_TipoDocumentoEntity');
        }
         *
         */
        return $this->_dbTable;
    }

        /**
         * Guarda en la base de datos la entidad especificada
         *
         * @param Spalm_Model_Mapper_BaseMapper $entity
         */
        // puede lanzar las excepciones por:
        /*
         * no se especificaron todos los campos requeridos
         * el objeto a guardar es un duplicado
         */
        public abstract function save($entity);

        /**
         * Recupera cierta entidad de la base de datos con una pk determinada
         *
         * @param <type> $pk
         * @param Spalm_Model_Mapper_BaseMapper $entity
         */
        public abstract function find($pk,$entity);

        /**
        *  Recupera todo los tipos de documentos almacenados en la base de datos
        *
        * @return array tipos de documentos
        */
        public abstract function fetchAll($where = null);

        /**
         * Elimina de la base de datos la entidad especificada
         * 
         * @param <type> $entity
         */
        public function remove(Spalm_Model_Single_BaseEntity $entity){
        $tabla = $this->getDbTable();
        $id = $entity->getPK();

            if (!isset ($id)){
                throw new NoExisteEntidadException('No hay entidad a eliminar');
            }

        $tabla->delete(array('id = ?' => $id));
    }
}
?>
